package com.itgaoshu.hospitalproject.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itgaoshu.hospitalproject.bean.DataGridView;
import com.itgaoshu.hospitalproject.bean.User;
import com.itgaoshu.hospitalproject.bean.UserRole;
import com.itgaoshu.hospitalproject.configshiro.UserCredentialsMatcher;
import com.itgaoshu.hospitalproject.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //在主菜单中个人资料进行修改用户信息根据id来修改
    @RequestMapping("editLogin")
    @ResponseBody
    public Object editLogin(User user){
        int i = userService.editLogin(user);
        if(i>0){
            return "修改成功";
        }else{
            return "修改失败";
        }
    }

    //在主菜单的个人资料中进行修改密码以及修改盐值
    @ResponseBody
    @RequestMapping("editPwd")
    public Object editPwd(User user, String loginname, String pwd, String pwd1, Model model){
        //创建Subject对象
        Subject subject = SecurityUtils.getSubject();
        //获取token凭证
        UsernamePasswordToken token = new UsernamePasswordToken(loginname,pwd);
        try{
            //要根据loginname来认证是不是这个密码，如果认证通过既可以修改密码
            subject.login(token);
            //认证通过之后要将这个新的密码进行加盐的操作，所以自定义一个类来计算加盐的操作
            //加盐的长度为6位
            String salt = UserCredentialsMatcher.radomSalt(6);
            //设置加密的方法,需要迭代两次
           user.setPwd( UserCredentialsMatcher.saltPassword("MD5", pwd1, salt, 2));
           user.setSalt(salt);
            int i = userService.editPwd(user);
            return "1";
        }catch (IncorrectCredentialsException e){//原始密码不正确
            return "0";
        }
    }

    /**
     * 添加新用户的方法
     * @param user 用户实体类
     * @return 用户显示页面
     */
    @RequestMapping("addUser")
    @ResponseBody
    public Object addUser(User user){
        //查重用户名: 检查是否有重复的用户名存在
        int checked = userService.checkUser(user);
        if(checked > 0){
            return "当前登陆名已存在";
        }else {
            //加盐
            String salt = UserCredentialsMatcher.radomSalt(6);
            //MD5加密迭代两次
            user.setPwd(UserCredentialsMatcher.saltPassword("MD5", "123456", salt, 2));
            user.setType(2);
            user.setSalt(salt);
            System.out.println(salt);
            int result = userService.addUser(user);
            if (result > 0) {
                return "添加成功";
            } else {
                return "添加失败";
            }
        }
    }

    /**
     * 根据输入的查询条件（用户姓名，登录名，地址，电话，身份证）模糊查询用户信息的方法
     * @param page 当前页数
     * @param limit 每页显示信息数
     * @param user 用户信息
     * @return 用户信息列表
     */
    @RequestMapping("selectAllUser")
    @ResponseBody
    public Object selectAllUser(int page,int limit,User user){
        PageHelper.startPage(page, limit);
        List<User> allUser = userService.selectAllUser(user);
        PageInfo pageInfo = new PageInfo(allUser);
        Map<String, Object> tableData = new HashMap<String, Object>();
        //这是layui要求返回的json数据格式
        tableData.put("code", 0);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", pageInfo.getTotal());
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", pageInfo.getList());

        return tableData;
    }

    /**
     * 编辑用户信息的方法
     * @param user 用户信息实体类
     * @return 显示用户信息页面
     */
    @RequestMapping("updateUser")
    @ResponseBody
    public Object updateUser(User user){
        int reslult = userService.updateUser(user);
        if(reslult > 0){
            return "修改成功";
        }else{
            return "修改失败";
        }
    }

    /**
     * 根据用户id删除用户的方法
     * @param userid 用户id
     * @return 显示用户信息页面
     */
    @RequestMapping("deleteUser")
    @ResponseBody
    public Object deleteUser(int userid){
        int reslut = userService.deleteUser(userid);
        if(reslut > 0){
            return "删除成功";
        }else{
            return "删除失败";
        }

    }

    /**
     * 根据用户id重置用户密码的方法
     * @param user 用户信息
     * @param userid 用户id
     * @return
     */
    @RequestMapping("resetUserPwd")
    @ResponseBody
    public Object resetUserPwd(User user,int userid){
        user.setUserid(userid);
        //加盐
        String salt = UserCredentialsMatcher.radomSalt(6);
        //MD5加密迭代两次
        user.setPwd(UserCredentialsMatcher.saltPassword("MD5", "123456", salt, 2));
        user.setType(2);
        user.setSalt(salt);
        int result = userService.resetUserPwd(user);
        if(result > 0){
            return "重置成功";
        }else {
            return "重置失败";
        }
    }

    /**
     * 初始化用户角色的方法
     * @param userid 用户id
     * @return
     */
    @RequestMapping("initUserRole")
    @ResponseBody
    public DataGridView initUserRole(int userid){
        return userService.queryUserRole(userid);
    }

    /**
     * 保存永辉的角色
     * @param userRole
     * @return
     */
    @RequestMapping("saveUserRole")
    @ResponseBody
    public Object saveUserRole(UserRole userRole){
        userService.saveUserRole(userRole);
        return "分配成功";
    }
}
